package com.twq.types.abstracttype

import java.io.FileInputStream

/**
 * Created by tangweiqun on 2017/12/6.
 */

class Rabbit extends Animal {
  type SuitableFood = Grass

  override def eat(food: Grass) = {}
}

object Resources {

  def main(args: Array[String]): Unit = {
    //构建一个结构化类型
    //1、直接用类名来构建

    //val grassEaters: List[GrassEater] = Nil
    // new Cow() :: new Rabbit() :: grassEaters

    val animals: List[Animal {type SuitableFood = Grass}] = Nil
    new Cow() :: new Rabbit() :: animals

    //2、使用type关键字来构建
    Resources.closeResource(new FileInputStream("")) //这样可以调用成功，是因为System.in这个对象对应的类型中含有close方法

  }

  //通过type关键字定义，并且同时定义期望类型里所具有的方法签名和变量签名
  type Resource = {
    def close(): Unit
  }

  //可以适用于任何的对象
  //参数不需要继承规定的特质或类
  //2.2 需要注意的是结构化类型一般都是利用反射实现的
  //有些平台不支持反射，或者反射会有性能问题，所以在对性能要求很高的地方，我们还是用接口的比较好
  def closeResource(r: Resource) = r.close()

}




